package com.yc.api.io;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * Company 源辰信息
 *
 * @author navy
 * @date 2024/11/8
 * Email haijunzhou@hnit.edu.cn
 */
public class IoDemo {

    public static void main1(String[] args) {

        File file1 = new File("D:\\dtd\\test\\a.txt");
        File file2 = new File("D:\\dtd\\test", "a.txt");
        System.out.println("file1 = " + file1);
        System.out.println("file2 = " + file2);
        System.out.println("file1.equals(file2) = " + file1.equals(file2));

        System.out.println("file1.exists() = " + file1.exists());
        System.out.println("file2.length() = " + file2.length());
        System.out.println("new Date(file2.lastModified()) = " + new Date(file2.lastModified()));

        System.out.println("file1.isFile() = " + file1.isFile());
        file2 = new File("D:\\dtd\\test");
        System.out.println("file2.isFile() = " + file2.isFile());
        System.out.println("file2.isDirectory() = " + file2.isDirectory());

        System.out.println("-------- isFile or isDirectory --------------");
        File file3 = new File("b.txt");
        System.out.println("file3.getPath() = " + file3.getPath());         // 相对路径
        System.out.println("file3.getAbsolutePath() = " + file3.getAbsolutePath()); // 绝对路径
        System.out.println("file3.isFile() = " + file3.isFile());
        System.out.println("file3.isDirectory() = " + file3.isDirectory());
        System.out.println("file3.exists() = " + file3.exists());
        // 不存在的文件 不能确定类型 两个判断都是 false

        try {
            if (file3.exists()) {
                // 删除文件或目录
                file3.delete();
            }
            System.out.println("file3.createNewFile() = " + file3.createNewFile()); // 见文件

            file3 = new File("abc");
            if (file3.exists()) {
                // 删除文件或目录
                file3.delete();
            }
            System.out.println("file3.mkdir() = " + file3.mkdir());         // 建单级目录

            // 多级目录删除, 必须先删除内部文件和目录 => 递归
            file3 = new File("abc/a/b/c");
            System.out.println("file3.mkdirs() = " + file3.mkdirs());        // 建多级目录
        } catch (IOException e) {
            System.out.println("文件创建失败!空间不足,权限不够,文件目录已经存在...");
            throw new RuntimeException(e);
        }
    }

    public static void main2(String[] args) {
        File file = new File("D:\\dtd");
        // 查看所有文件
        for (String s : file.list()) {
            System.out.println("s = " + s);
        }

        for (File listFile : file.listFiles()) {
            System.out.println("listFile = " + listFile);
        }

        file = new File("c:\\windows");

        System.out.println("------------- 名字过滤 ---------------------");
        String[] sFiles = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                // 过滤出名字里面有 s 的文件和目录
                //return name.toLowerCase().contains("s");
                // 过滤出名字 s 开头的文件和目录
                return name.startsWith("s");
            }
        });
        for (String sFile : sFiles) {
            System.out.println("sFile = " + sFile);
        }

        System.out.println("-------------- 属性, 类别过滤 --------------------");
        // 只有一个方法的接口是函数接口 => lambda 表达式
        File[] files = file.listFiles(pathname->{
            // 只过滤目录
            // return pathname.isDirectory();
            // 只过滤文件
            // return pathname.isFile();
            // 过滤大于 1M 的文件
            return pathname.length() > 1024 * 1024;
        });
        for (File f : files) {
            System.out.println("f = " + f);
        }

        System.out.println("-------------- 递归查询文件 --------------------");
        List<File> finds = new ArrayList<>();
        // 递归查询
        findFile("Demo", new File("E:\\上课视频\\149\\yc149"), finds);
        for (File find : finds) {
            System.out.println("find = " + find);
        }
    }

    // 递归查询
    static void findFile(String likeName, File dir, List<File> res){
        // 查询名字里面包含 likeName 的文件和文件夹
        File[] files = dir.listFiles(file -> file.getName().contains(likeName));
        // addAll 添加全部元素,   Arrays.asList数组转list集合
        if(files != null && files.length>0){
            res.addAll(Arrays.asList(files));
        }

        // 查找子目录
        File[] subDirs = dir.listFiles(file -> file.isDirectory());
        if(subDirs != null && subDirs.length>0){
            for (File subDir : subDirs) {
                findFile(likeName, subDir, res);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        // 读入一个文本文件, 并显示内容
        String txtFilePath = "E:\\上课视频\\149\\yc149\\.gitignore";
        // 读入字符文件   文件输入字符流
        FileReader fr = new FileReader(txtFilePath);
        // 缓存变量 勺子
        char[] chars = new char[100];
        // 定义勺子的刻度
        int count = 0;

        // fr.read(chars) 读取数据到 chars, 返回读到的数据的数量 => 刻度
        // 赋值 表达式 本身会返回赋值的结果
        while(  ( count = fr.read(chars) )  > -1 ) {
            String data = new String(chars, 0, count);
            //这里不能用 println, data里面包含的 换行符
            System.out.print(data);
        }
        // 关闭流, 不关会一直占用文件
        fr.close();

        System.out.println("---------------------------");
        // 复制一个图片文件, 到指定目录
        FileInputStream fis = new FileInputStream("e:\\a.png");
        // 文件输出流会自动创建文件
        FileOutputStream fos = new FileOutputStream("f:\\girl.png");

        try{
            byte[] buffer = new byte[200];
            int cnt = 0;
            while((cnt = fis.read(buffer))>-1){
                // 输出到  f:\\girl.png
                fos.write(buffer,0,cnt);
            }
            System.out.println("文件复制完成!");
        } catch (IOException e){
            e.printStackTrace();
        } finally {
            fis.close();
            fos.close();
        }
    }

}
